iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 12

C - sensitive data exposure (敏感性資料儲存:明文儲存資料)

  • 分享至 

  • xImage
  •  

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

C - sensitive data exposure(敏感性資料儲存:明文儲存資料)

  • 形成原因:明文儲存資料、在多個線上服務中重複使用相同的密碼
  • 後果:將敏感資料呈現給未經授權的使用者,導致敏感資料洩漏或是身份劫持
  • 實例:一台存有病患資料的的電腦使用簡單及無加鹽演算法雜湊資料,攻擊者使用彩虹表或是gpu暴力破解雜湊資料
  • 解決方法:
    • 在傳輸及靜態期間都要加密資料
    • 使用安全的協定傳輸像是TLS
    • 使用強雜湊和加密演算法
    • 雜湊時加鹽
    • 停用敏感資料快取

第1題

錯誤區塊

dbQuery.arg( account->name ).arg( account->login ).arg( account->password ).arg( account->salt );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
dbQuery.arg( account->login ).arg( account->password ).arg( account->salt );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:使用者密碼以純文字形式儲存在資料庫中。 因此,如果攻擊者可以存取資料庫,它將可以輕鬆地存取整個資料庫的資料。

主要修正方法

在建立account這個資料庫裡的鍵值之前先判斷是不是明文

if( isPlaintextPassword )
{
    account->cipher();
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

後續判斷使用者輸入password的時候也先加密再比對資料庫的值

解釋:
使用者密碼以雜湊形式儲存。

第2題

錯誤區塊

account->password = password;
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:更改使用者密碼時,新密碼以簡單的文字形式儲存在資料庫中,可能導致被潛在攻擊者揭露。

主要修正方法

在錯誤區塊加入

account->cipher();
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

後再將資料存到資料庫

解釋:更改現有使用者密碼時,新使用者密碼將加鹽處理並安全雜湊後,再儲存到資料庫中

第3題

錯誤區塊

return text;
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:即將釋出的XML檔案包含純文字

主要修正方法

把錯誤區塊改成

const int outLength = 32;
unsigned char out[ outLength ];
const int encodedLength = 128;
char encoded[ encodedLength ];
argon2_type type = Argon2_i;

int result = argon2_hash( 2, 1 << 16, 1,
    text.c_str(), text.length(),
    salt.c_str(), salt.length(),
    out, outLength,
    encoded, encodedLength,
    type, ARGON2_VERSION_NUMBER);

if( result != ARGON2_OK )
{
    std::cout << "Error: " << argon2_error_message( result ) << std::endl;
    exit(1);
}
unsigned char hexout[ outLength * 2 + 4 ];
for( int i = 0; i < outLength; i++ )
{
    sprintf((char*)(hexout + i * 2), "%02x", out[ i ] );
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
該系統可以將所有使用者的帳戶匯出(匯入)到(來自)XML檔案中。
可以使用“-e”鍵指定輸出的XML檔名。
因此,該檔案必須包含所有使用者的資料,包括他們的密碼。
強烈建議將所有密碼加密。


上一篇
C - insecure randoness(不安全的密碼術:隨機性不安全)
下一篇
C - XML external entity injection (XML 外部實體 (XXE))
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言